package INTERFAZ;


import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

import JUEGO.Hilo;
import JUEGO.Juego;
import MUNDO.GestorMapas;
import MUNDO.Mapa;

import java.awt.Color;
public class Dibujador extends JFrame implements Serializable {
	
	public int flag = 0;
	private int a;
    private int b;
    private int x;
    public int getA() {
		return a;
	}

	public int getB() {
		return b;
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}

	
	private int y;
    private int x1=60;
    private int y1=60;
    private int x2=0;
    private int y2=0;
    private Mapa mapa;
    transient private BufferedImage  imgFondoIzqSuperior,imgPersonaje,
    						imgFondoIzqInferior,imgFondoDerecho,
    						imgMapa,imgFusilero,imgAldea,imgAliado,
    						imgArtillero,imgCasaIndigena,imgMunicipalidad,
    						imgSave,imgInfo,imgGameOver,imgWin,imgCamino,imgCharco,imgMontanha;
    transient private Image  imgBienvenida;

    public  BufferStrategy bufferStrategy;
    public Mapa getMapa() {
		return mapa;
	}
	private GestorMapas episodios;
    public GestorMapas getEpisodios() {
		return episodios;
	}

	public int getInd_mapa() {
		return ind_mapa;
	}
	private int ind_mapa;
    private int curada = 0;
    private boolean teataco = false;
    private boolean meatacan = false;
    private int enemigo;
    public void setEnemigo(int enemigo) {
		this.enemigo = enemigo;
	}
	private boolean dibujar = false;
    
    public int getCurada() {
		return curada;
	}

	public void setCurada(int curada) {
		this.curada = curada;
	}
	
	public void setTeataco(boolean teataco) {
		this.teataco = teataco;
	}

	public void setMeatacan(boolean meatacan) {
		this.meatacan = meatacan;
	}

	public Dibujador(int a,int b, GestorMapas episodios){
        this.a=a;
        this.b=b;
        this.episodios = episodios;
        
        musica();
        Toolkit tk =getToolkit();
        imgBienvenida=tk.createImage("fondos/bienvenida.png");
        Juego.setBatallonesXY(0,Juego.xIniciaBatallon, Juego.yIniciaBatallon);//inicializamos el primer batallon
        configurarVentana();
        
        try{
        	//fondos
			imgFondoIzqSuperior = ImageIO.read(new File("fondos/fondoIzqSuperior.jpg"));	
			imgFondoIzqInferior = ImageIO.read(new File("fondos/fondoIzqInferior.jpg"));
			imgFondoDerecho = ImageIO.read(new File("fondos/fondoDerecho.jpg"));
			//unidades
			imgMapa = ImageIO.read(new File("Unidades/mapa.png"));
			imgPersonaje = ImageIO.read(new File("Unidades/AnguloImg.png"));
			imgFusilero = ImageIO.read(new File("Unidades/FusileroImg.png"));
			imgAldea = ImageIO.read(new File("Unidades/AldeaImg.png"));
			imgAliado = ImageIO.read(new File("Unidades/AliadoImg.png"));
			imgArtillero = ImageIO.read(new File("Unidades/ArtilleroImg.png"));
			imgCasaIndigena = ImageIO.read(new File("Unidades/IndigenaImg.png"));
			imgMunicipalidad = ImageIO.read(new File("Unidades/MunicipalidadImg.png"));
			imgSave = ImageIO.read(new File("Unidades/SaveImg.png"));
			imgInfo = ImageIO.read(new File("Unidades/InfoImg.png"));
			imgGameOver = ImageIO.read(new File("fondos/gameOver.jpg"));
			imgWin = ImageIO.read(new File("fondos/Win.jpg"));
			//terreno
			imgCamino = ImageIO.read(new File("Unidades/camino.png"));
			imgCharco = ImageIO.read(new File("Unidades/charco.png"));
			imgMontanha = ImageIO.read(new File("Unidades/montana.png"));
			

		}catch(java.io.IOException e){

		}catch(Exception ex){
		}finally{

		}
        Dibujador.this.ind_mapa=0;
        
		dibujar=true;
		setTitle("LA TOMA DE CUZCO");
		Dibujador.this.x=Dibujador.this.episodios.obtenerMapa(ind_mapa).getCoordX();
		Dibujador.this.y=Dibujador.this.episodios.obtenerMapa(ind_mapa).getCoordY();
		Dibujador.this.mapa=Dibujador.this.episodios.obtenerMapa(ind_mapa);		
		update(Dibujador.this.getGraphics());
		
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				e.getWindow().dispose();
				System.exit(0);
			}
		});
		
		addMouseListener(new MouseAdapter(){
			public void mouseClicked(MouseEvent e) {
				int coordx=e.getX();
				int coordy=e.getY();
				//BUTTON1 es click izq se utiliza para atacar
				if (e.getButton()==MouseEvent.BUTTON1){
					
				int p=0;
		    	int q=60;
		    	int ipos = 0, jpos = 0;
		    	char unidad = 0;
		    	for (int i=Dibujador.this.x-Dibujador.this.a;i<=Dibujador.this.x+Dibujador.this.a;i++){
		            for (int j=Dibujador.this.y-Dibujador.this.b;j<=Dibujador.this.y+Dibujador.this.b;j++){
		            	if (i>=0 && i<Dibujador.this.mapa.getM() && j>=0 && j<Dibujador.this.mapa.getN()){
		            	  if (coordx>=p+1 && coordx<=p+39  && coordy>=q-39 && coordy<=q-1){
		            		  //JOptionPane.showMessageDialog(Dibujador.this," i->"+i+" j->"+j);
		            		  unidad = Dibujador.this.mapa.getTerreno(i, j).getUnidad();
		            		  //JOptionPane.showMessageDialog(Dibujador.this,"unidad: "+unidad);
		            		  ipos = i; jpos = j;
		            	  }
		             	  p += 40;
		                }
		            }
		            if (i>=0 && i<Dibujador.this.mapa.getM()){
		            	//g.drawString("*",p,q);
		            	q += 40;
		            }
		            p = 0;
		        }
				
		    	if (unidad == 'A' || unidad == 'a'){
		    		//System.out.println(ipos + "  "  + jpos);
		    		Juego.CambiarBatallon(ipos, jpos, Dibujador.this.ind_mapa, Dibujador.this.episodios);
				}
		    	
		    	if (unidad == 't' || unidad == 'c'){
		    		Juego.ParadaNeutral(unidad, ipos,jpos);
				}
		    	
		    	if (unidad == 'f' || unidad == 'e' || unidad == 'B'){
		    		Juego.ParadaEnemigo(1,ipos,jpos);
		    	}
		    	
				}

				if (e.getButton()==MouseEvent.BUTTON3){
					
					int p=0;
			    	int q=60;
			    	int ipos = 0, jpos = 0;
			    	char unidad = 0;
			    	for (int i=Dibujador.this.x-Dibujador.this.a;i<=Dibujador.this.x+Dibujador.this.a;i++){
			            for (int j=Dibujador.this.y-Dibujador.this.b;j<=Dibujador.this.y+Dibujador.this.b;j++){
			            	if (i>=0 && i<Dibujador.this.mapa.getM() && j>=0 && j<Dibujador.this.mapa.getN()){
			            	  if (coordx>=p+1 && coordx<=p+39  && coordy>=q-39 && coordy<=q-1){
			            		  //JOptionPane.showMessageDialog(Dibujador.this," i->"+i+" j->"+j);
			            		  unidad = Dibujador.this.mapa.getTerreno(i, j).getUnidad();
			            		  //JOptionPane.showMessageDialog(Dibujador.this,"unidad: "+unidad);
			            		  ipos = i; jpos = j;
			            	  }
			             	  p += 40;
			                }
			            }
			            if (i>=0 && i<Dibujador.this.mapa.getM()){
			            	//g.drawString("*",p,q);
			            	q += 40;
			            }
			            p = 0;
			        }
			    	
			    	if (unidad == 'f' || unidad == 'e' || unidad == 'B'){
			    		Juego.ParadaEnemigo(3,ipos,jpos);
			    	}
				}

			}
		});
		
		addKeyListener(new KeyAdapter(){
			public synchronized void keyPressed(KeyEvent e){
				if(e.getKeyCode()==KeyEvent.VK_UP)
					
						Juego.MoverBatallon('w', Dibujador.this.ind_mapa, Dibujador.this.episodios);
					
				else if(e.getKeyCode()==KeyEvent.VK_LEFT)
					
						Juego.MoverBatallon('a', Dibujador.this.ind_mapa, Dibujador.this.episodios);
					
				else if(e.getKeyCode()==KeyEvent.VK_RIGHT)
					
						Juego.MoverBatallon('d', Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if(e.getKeyCode()==KeyEvent.VK_DOWN)
						Juego.MoverBatallon('s', Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if(e.getKeyCode()==KeyEvent.VK_Q)
						Juego.CurarUnidades(Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if(e.getKeyCode()==KeyEvent.VK_ESCAPE) {	
					Juego.SalidaJuego();
				}
				else if(e.getKeyCode()==KeyEvent.VK_G){
					
					Juego.getHiloEnemigo().Finaliza();
					try { 
						Juego.getHiloEnemigo().join(); 
						
						guardar();
					} catch(Exception e1) {

					}
					
					Juego.creaTurno();
				}
			}
		});
        
    }
    
    public void set_dibujar(int x,int y,Mapa mapa){
    	this.x=x;
    	this.y=y;
    	this.mapa=mapa;
    }
    
    private void configurarVentana(){
		setBounds(0,0,1300,705);
		setTitle("BIENVENIDOS AL JUEGO DE LP2");
		setVisible(true);
		//int i=0,j=0;
		boolean flagbot = false;
		while (flagbot == false){
			Object[] options = {"Nuevo Juego","Cargar Juego","Salir"};
			int n = JOptionPane.showOptionDialog(this,"Elija una opcion para comenzar la partida.",
						"Bienvenido",
						JOptionPane.YES_NO_CANCEL_OPTION,
						JOptionPane.PLAIN_MESSAGE,
						null,
						options,
						options[2]);

			createBufferStrategy(2);
        	bufferStrategy = getBufferStrategy();
        	
        	if(n == JOptionPane.CANCEL_OPTION){
        		System.exit(0);
        	}
			if (n == JOptionPane.NO_OPTION){
				try {
					flagbot = leer();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			else if (n == JOptionPane.YES_OPTION) {
				flagbot = true;
			}
		}
	}
    public void dibujar(Graphics g){
    	
    	//panel izquierdo superior
    	int p=0;//fila
    	int q=20;//columna
    	int x_aux=0,y_aux=0;
    	this.x1=60;
		this.y1=60;
		this.x2=0;
		this.y2=0;
    	for (int i=x-a;i<=x+a;i++){
    	
            for (int j=y-b;j<=y+b;j++){
            	if (i>=0 && i<mapa.getM() && j>=0 && j<mapa.getN()){
                	//this.x1=(x1>j)?j:x1;this.y1=(y1>i)?i:y1;
                	//this.x2=(x2<j)?j:x2;this.y2=(y2<i)?i:y2;
             	   //if(i==x && j==y){
             		   
             		 //  g.drawString("x",p,q);
             		  // x_aux=p;
             		   //y_aux=q;
             		   
             		 //  p += 40;
             		   //continue;
             	   //}
             	   //g.drawString(Character.toString(mapa.getTerreno(i, j).getUnidad()),p,q);
            		switch (mapa.getTerreno(i, j).getTipo()){
              	   		case '.':g.drawImage(imgCamino, p,q, this);break;
              	   		case ',':g.drawImage(imgCharco, p,q, this);break;
              	   		case 'm':g.drawImage(imgMontanha, p,q, this);break;
              	   	}
             	  p += 40;
                }
            }
            if (i>=0 && i<mapa.getM()){
           
            	q += 40;
            }
            p = 0;
        }
    	//g.drawImage(imgMapa, 0, 0, x2*40+40 -x1*40, y2*40+40-y1*40+20, x1*40, y1*40-20, x2*40+40, y2*40+40, this);

    	//se dibuja las unidades en su respectiva posicion
    	p=0;//fila
    	q=20;//columna
    	for (int i=x-a;i<=x+a;i++){
        	
            for (int j=y-b;j<=y+b;j++){
            	if (i>=0 && i<mapa.getM() && j>=0 && j<mapa.getN()){
             	   //g.drawString(Character.toString(mapa.getTerreno(i, j).getUnidad()),p,q);
             	   switch (mapa.getTerreno(i, j).getUnidad()){
             	   case 'A':g.drawImage(imgPersonaje, p,q, this);break;
             	   case 'e':g.drawImage(imgArtillero, p,q, this);break;
             	   case 'f':g.drawImage(imgFusilero, p,q, this);break;
             	   case 'c':g.drawImage(imgCasaIndigena, p,q, this);break;
             	   case 't':g.drawImage(imgAldea, p,q, this);break;
             	   case 'B':g.drawImage(imgMunicipalidad, p,q, this);break;
             	   case 'a':g.drawImage(imgAliado, p,q, this);break;
             	   case 'i':g.drawImage(imgInfo, p,q, this);break;
             	   case 'S':g.drawImage(imgSave, p,q, this);break;
             	   
             	   }
             	  p += 40;
                }
            }
            if (i>=0 && i<mapa.getM()){
            
            	q += 40;
            }
            p = 0;
        }
    	
    	//
    	    
        
    	
    	
    	
    	
    	//se dibuja el personaje en su posicion
    	//g.drawImage(imgPersonaje, x_aux,y_aux, this);

    	
    	//panel izquierdo inferior
    	g.setColor(Color.lightGray); g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );
    	q = 420;
    	p = 20;
    	g.drawString("HP BATALLON ",p,q);
    	
    	if (mapa.getTerreno(x, y).getBatallon().getHP()>300)
    		{g.setColor(Color.black); g.setFont( new Font( "SansSerif", Font.PLAIN, 15 ) );}
    	else
    		{g.setColor(Color.red); g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );	}
    	String comandos = "= "+mapa.getTerreno(x, y).getBatallon().getHP();
    	g.drawString(comandos,p+110,q);
    	
    	g.setColor(Color.lightGray); g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );
    	g.drawString("DINERO ", p+220, q);
    	
    	g.setColor(Color.black); g.setFont( new Font( "SansSerif", Font.PLAIN, 15 ) );
    	comandos = "= "+Juego.getDinero();
    	g.drawString(comandos, p+280, q);
    	
    	q += 30;
    	p = 20;
    	g.setColor(Color.lightGray); g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );
    	g.drawString("Movimiento: ",p,q);
    	g.setColor(Color.black); g.setFont( new Font( "SansSerif", Font.PLAIN, 15 ) );
    	g.drawString("^ - Norte | < - Oeste | > - Sur | v - Este",p+100,q);
    	
    	q += 20;
    	p = 20;
    	g.setColor(Color.lightGray); g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );
    	g.drawString("Click Izquierdo: ",p,q);
    	g.setColor(Color.black); g.setFont( new Font( "SansSerif", Font.PLAIN, 15 ) );
    	g.drawString("Cambiar Batallon / Atacar Batallon / Comprar Armas / Reclutar",p+125,q);
    	
    	q += 20;
    	p = 20;
    	g.setColor(Color.lightGray); g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );
    	g.drawString("Click Derecho: ",p,q);
    	g.setColor(Color.black); g.setFont( new Font( "SansSerif", Font.PLAIN, 15 ) );
    	g.drawString("Sobornar Enemigo",p+120,q);
    	
    	q += 20;
    	p = 20;

    	g.setColor(Color.getHSBColor(30, 50, 70)); g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );
    	g.drawString("q - Curar | g - Guardar Partida | ESC - Salir del Juego",p,q);

    	
    	q += 20;
    	g.setColor(Color.white); g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );
    	if (curada == 1){
    		q += 20;
        	p = 20;
        	g.setColor(Color.white); g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );
        	g.drawString("Curacion hecha con exito.",p,q);
    		curada = 0;
    	}
    	
    	if (curada == 2){
    		q += 20;
        	p = 20;
        	g.setColor(Color.white); g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );
        	g.drawString("No tienes Rabonas en el batallon para curarte.",p,q);
    		curada = 0;
    	}

    	if(teataco==true || meatacan==true){
    		
    		if(teataco) {
        		g.drawString("Has atacado al enemigo!",20,q+=20);
        		
        		comandos = "HP Enemigo: " + mapa.getTerreno(Juego.getCoorXEnemigo(1),Juego.getCoorYEnemigo(1)).getBatallon().getHP();
            	g.drawString(comandos,20,q+=20);
            	//System.out.printf("HP Enemigo: %d\n",(terreno[fx][fy].getBatallon().getHP()));
        	}
    		if (meatacan) {
    			 g.drawString("El enemigo te ha atacado!",20,q+=20);
    			 comandos = "Tu HP: " + mapa.getTerreno(x, y).getBatallon().getHP();
    			 g.drawString(comandos,20,q+=20);
    	        	//System.out.printf("Tu HP: %d\n",(terreno[fx][fy].getBatallon().getHP()));
    			 
    		 }
    		teataco=false;meatacan=false;
    	}
    	//se muestra el miniMapa
    	q=540;
    	p=440;
    	for (int i=0;i<mapa.getM();i++){
        	
            for (int j=0;j<mapa.getN();j++){
            	switch (mapa.getTerreno(i, j).getTipo()){
      	   		case '.':g.drawImage(imgCamino, p,q,p+8,q+8,0,0,40,40, this);break;
      	   		case ',':g.drawImage(imgCharco, p,q,p+8,q+8,0,0,40,40, this);break;
      	   		case 'm':g.drawImage(imgMontanha, p,q,p+8,q+8,0,0,40,40, this);break;
      	   		}
          	   switch (mapa.getTerreno(i, j).getUnidad()){
          	   case 'A':g.drawImage(imgPersonaje, p,q,p+8,q+8,0,0,40,40, this);break;
          	   case 'e':g.drawImage(imgArtillero, p,q,p+8,q+8,0,0,40,40, this);break;
          	   case 'f':g.drawImage(imgFusilero, p,q,p+8,q+8,0,0,40,40, this);break;
          	   case 'c':g.drawImage(imgCasaIndigena, p,q,p+8,q+8,0,0,40,40, this);break;
          	   case 't':g.drawImage(imgAldea, p,q,p+8,q+8,0,0,40,40, this);break;
          	   case 'B':g.drawImage(imgMunicipalidad, p,q,p+8,q+8,0,0,40,40, this);break;
          	   case 'a':g.drawImage(imgAliado, p,q,p+8,q+8,0,0,40,40, this);break;
          	   case 'i':g.drawImage(imgInfo, p,q,p+8,q+8,0,0,40,40, this);break;
          	   case 'S':g.drawImage(imgSave, p,q,p+8,q+8,0,0,40,40, this);break;
          	   
          	   }
          	   p+=8;
            	
            }
            q+=8;
            p=440;
    	}
    
    	//panel derecho
    	escribirbatallon(g);
//    	for (int a = 0; a < 20; a++){
//    		for (int b = 0; b< 20; b++){
//    			System.out.print(Dibujador.this.mapa.getTerreno(a, b).getUnidad());
//    		}
//    		System.out.println("");
//    	}
//    	System.out.println("");
    	
    	
    
    
    }
    
    public void escribirbatallon(Graphics g){
    	int p=620;
    	int q = 50;
    	int esp = 0;
		
		int batallon=Juego.getBatallonactual()-1;
    	g.setColor(Color.WHITE);
    	g.setFont( new Font( "SansSerif", Font.BOLD, 15 ) );
		String numbatstr = "Batallon Nro: " + (batallon+1);
		g.drawString(numbatstr,p,q);
		
		q+=30;
		int limite = episodios.obtenerMapa(ind_mapa).getTerreno(Juego.getBatallonesX().get(batallon) , Juego.getBatallonesY().get(batallon)).getBatallon().getNpersonajes();
		episodios.obtenerMapa(ind_mapa).getTerreno(Juego.getBatallonesX().get(batallon) , Juego.getBatallonesY().get(batallon)).getBatallon().ordenar_personaje();
		for (int j = 0; j < limite; j++){
			if (j != 0 && (j % 5) == 0){
				esp += 230;
				p = 620 + esp;
				q = 80;
			}
			episodios.obtenerMapa(ind_mapa).getTerreno(Juego.getBatallonesX().get(batallon),Juego.getBatallonesY().get(batallon))
														.getBatallon().getPersonaje(j).mostrarPersonajeVentana(g, p, q);
			q += 130;
	    	//Ventana.this.p = 20;
			p = 620 + esp;
		}
}
    public void paint(Graphics g){
    	
 
    	
    	
    	if(dibujar){
    		Graphics2D graph2D = (Graphics2D)bufferStrategy.getDrawGraphics();
    		
    		super.paint(graph2D);
	    	try{	
	    		
	    		if(flag==0){
	    			graph2D.drawImage(imgFondoIzqSuperior, 0,0,600,400, this);
	    			graph2D.drawImage(imgFondoIzqInferior, 0,380,700,600, this);
	    			graph2D.drawImage(imgFondoDerecho, 600,0,1300,700, this);
	    			dibujar(graph2D);
	    		}
	    		else if (flag==1) {
	    			graph2D.drawImage(imgGameOver,0,0,1300,700,this);
	    		}
	    		else if (flag==2) {
	    			graph2D.drawImage(imgWin,0,0,1300,700,this);
	    		}
	    			
			}catch(Exception e){
		    	
		    }
	    	bufferStrategy.show();
	    }
    	else{
    		super.paint(g);
    		g.drawImage(imgBienvenida,0,0,1300,700,this);
    		
    	}
    	
    }
      
  public synchronized void guardar() throws IOException {
	
  	JFileChooser chooser = new JFileChooser("/Users/henrybeingolea/Dropbox");
  	chooser.setDialogTitle("Guardar en:"); 	
  	FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivos Binarios", "bin");
  	chooser.setAcceptAllFileFilterUsed(false);
    chooser.setFileFilter(filter);
    int returnVal = chooser.showSaveDialog(Dibujador.this);
    if(returnVal == JFileChooser.APPROVE_OPTION) {
    	//System.out.println("El archivo " +chooser.getSelectedFile().getName());
       	//System.out.println("Se guardo en"+chooser.getSelectedFile().getAbsolutePath());
	    //Creamos el archivo para poder escribir
	    FileOutputStream file=new FileOutputStream(chooser.getSelectedFile().getAbsolutePath() + ".bin");
	    //Creamos el objeto para poder escribir en el archivo        
	    ObjectOutputStream salida = new ObjectOutputStream(file);   
	    try {
	        salida.writeObject(this.episodios);
	        salida.writeInt(Juego.getDinero());
	        salida.writeInt(Juego.getBatallonactual());
	        salida.writeInt(Juego.getEnemigoactual());
	        salida.writeObject(Juego.getBatallonesX());
	        salida.writeObject(Juego.getBatallonesY());
	        salida.writeObject(Juego.getEnemigosX());
	        salida.writeObject(Juego.getEnemigosY());
	        //s.serializar(file);
	    } catch (IOException e1) {
	        System.err.print(e1.getMessage());
	        
	    }
	    file.close();
    }
    
}
  
  
  public boolean leer() throws IOException{
  	JFileChooser chooser = new JFileChooser("/Users/henrybeingolea/Dropbox");
  	chooser.setDialogTitle("Abrir desde:");
  	FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivos Binarios", "bin");
  	chooser.setAcceptAllFileFilterUsed(false);
  	chooser.setFileFilter(filter);
  	int returnVal = chooser.showOpenDialog(Dibujador.this);
  	if(returnVal == JFileChooser.APPROVE_OPTION){ 
  		//System.out.println("You chose to open this file: " +chooser.getSelectedFile().getName());
	  	FileInputStream f=new FileInputStream(chooser.getSelectedFile().getAbsolutePath());
	  	ObjectInputStream entrada = new ObjectInputStream(f);
	  	GestorMapas ep = this.episodios;
	  	int din = Juego.getDinero(), batact = Juego.getBatallonactual(), enact = Juego.getEnemigoactual();
	  	ArrayList<Integer> batx = Juego.getBatallonesX(), baty = Juego.getBatallonesY(), enx = Juego.getEnemigosX(), eny = Juego.getEnemigosY();
	  	for (int i=1; i<=8 ;i++){
	  		try {
	  				switch (i){
	  				case 1: ep = (GestorMapas)entrada.readObject(); break;
	  				case 2: din = entrada.readInt(); break;
	  				case 3: batact = entrada.readInt(); break;
	  				case 4: enact = entrada.readInt(); break;
	  				case 5: batx = (ArrayList<Integer>)entrada.readObject(); break;
	  				case 6: baty = (ArrayList<Integer>)entrada.readObject(); break;
	  				case 7: enx = (ArrayList<Integer>)entrada.readObject(); break;
	  				case 8: eny = (ArrayList<Integer>)entrada.readObject(); break;
	  				}
	  		} catch(IOException e1){
	  			System.err.print(e1.getMessage());
	  		} catch (ClassNotFoundException e) {
	  			System.err.print(e.getMessage());
			}
	  	}
	  	Juego.setDinero(din);
	  	Juego.setBatallonactual(batact);
	  	Juego.setEnemigoactual(enact);
	  	Juego.setBatallonesX(batx);
	  	Juego.setBatallonesY(baty);
	  	Juego.setEnemigosX(enx);
	  	Juego.setEnemigosY(eny);
	  	this.episodios = ep;
	  	
	  	f.close();
	  	return true;
  	}
  	else{
  		return false;
  	}
  	//update(Dibujador.this.getGraphics());
//      BufferedReader entrada = new BufferedReader( new FileReader( f ) );
//      if ( f.exists() )
//        System.out.println(entrada.readLine());
  }
  
  public synchronized void AccionNeutral(char unidad, int ipos, int jpos){
	  int n = 0;
	  if (unidad == 't'){
	  Object[] options = {"Comprar Armas","Reclutar Aldeanos"};
	  	n = JOptionPane.showOptionDialog(Dibujador.this,
				"Que accion desea realizar?",
				"Aldea",
				JOptionPane.YES_NO_OPTION,
				JOptionPane.QUESTION_MESSAGE, null,
	    		options,
	    		options[1]);
	  }
	  else if (unidad == 'c'){
		  n = JOptionPane.NO_OPTION;
	  }
		if(ipos+1 == Dibujador.this.x && jpos == Dibujador.this.y){//Dibujador.this.mapa.getTerreno(ipos+1, jpos).getUnidad() == 'A' || Dibujador.this.mapa.getTerreno(ipos+1, jpos).getUnidad() == 'a'){
				if (n == JOptionPane.YES_OPTION) Juego.AdquirirArmas('w', Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if (n == JOptionPane.NO_OPTION) Juego.ReclutarAliados('w', Dibujador.this.ind_mapa, Dibujador.this.episodios);
		}
		else if(ipos-1 == Dibujador.this.x && jpos == Dibujador.this.y){//Dibujador.this.mapa.getTerreno(ipos-1, jpos).getUnidad() == 'A' || Dibujador.this.mapa.getTerreno(ipos-1, jpos).getUnidad() == 'a'){
				if (n == JOptionPane.YES_OPTION) Juego.AdquirirArmas('s', Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if (n == JOptionPane.NO_OPTION) Juego.ReclutarAliados('s', Dibujador.this.ind_mapa, Dibujador.this.episodios);
		}
		else if(ipos == Dibujador.this.x && jpos+1 == Dibujador.this.y){//Dibujador.this.mapa.getTerreno(ipos, jpos+1).getUnidad() == 'A' || Dibujador.this.mapa.getTerreno(ipos, jpos+1).getUnidad() == 'a'){
				if (n == JOptionPane.YES_OPTION) Juego.AdquirirArmas('a', Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if (n == JOptionPane.NO_OPTION) Juego.ReclutarAliados('a', Dibujador.this.ind_mapa, Dibujador.this.episodios);
		}
		else if(ipos == Dibujador.this.x && jpos-1 == Dibujador.this.y){//Dibujador.this.mapa.getTerreno(ipos, jpos-1).getUnidad() == 'A' || Dibujador.this.mapa.getTerreno(ipos, jpos-1).getUnidad() == 'a'){
				if (n == JOptionPane.YES_OPTION) Juego.AdquirirArmas('d', Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if (n == JOptionPane.NO_OPTION) Juego.ReclutarAliados('d', Dibujador.this.ind_mapa, Dibujador.this.episodios);
		}
  }
  
  public synchronized void AccionEnemigo(int boton, int ipos, int jpos){
	  if(ipos+1 == Dibujador.this.x && jpos == Dibujador.this.y){
				if (boton == 1) Juego.AtacarBatallon('w', Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if (boton == 3) Juego.ReclutarAliados('w', Dibujador.this.ind_mapa, Dibujador.this.episodios);
			enemigo = 1;
		}
		else if(ipos-1 == Dibujador.this.x && jpos == Dibujador.this.y){
				if (boton == 1) Juego.AtacarBatallon('s', Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if (boton == 3) Juego.ReclutarAliados('s', Dibujador.this.ind_mapa, Dibujador.this.episodios);
			enemigo = 2;
		}
		else if(ipos == Dibujador.this.x && jpos+1 == Dibujador.this.y){
				if (boton == 1) Juego.AtacarBatallon('a', Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if (boton == 3) Juego.ReclutarAliados('a', Dibujador.this.ind_mapa, Dibujador.this.episodios);
			enemigo = 3;
		}
		else if(ipos == Dibujador.this.x && jpos-1 == Dibujador.this.y){
				if (boton == 1) Juego.AtacarBatallon('d', Dibujador.this.ind_mapa, Dibujador.this.episodios);
				else if (boton == 3) Juego.ReclutarAliados('d', Dibujador.this.ind_mapa, Dibujador.this.episodios);
			enemigo = 4;
		}
  }
  
  private void musica(){
	  File inputFile = new File("musica/Adv_Wars_Andy_v2.mid");
	  Sequence seq;
	  Sequencer sequencer;
	  try{
		  sequencer = MidiSystem.getSequencer();
		  seq = MidiSystem.getSequence(inputFile);
		  sequencer.setSequence(seq);
		  sequencer.open();
		  sequencer.start();
	  } catch(Exception e){}
  }
}



